package com.wyz.note.project.controller;

import com.wyz.note.project.result.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;


/**
 * @Description: 测试控制器
 * Mono 和 Flux 适用于两个场景，即：
 * Mono：实现发布者，并返回 0 或 1 个元素，即单对象。
 * Flux：实现发布者，并返回 N 个元素，即 List 列表对象。
 * 有人会问，这为啥不直接返回对象，比如返回 City/Long/List。
 * 原因是，直接使用 Flux 和 Mono 是非阻塞写法，相当于回调方式。
 * 利用函数式可以减少了回调，因此会看不到相关接口。这恰恰是 WebFlux 的好处：集合了非阻塞 + 异步
 * 参考链接：https://blog.csdn.net/u014365523/article/details/127638218
 * this: 注解方式开发
 * @Author: wei yz
 * @Date: 2023/7/2
 */
@Slf4j
@RestController
@RequestMapping("/api/demo")
public class DemoController {

    @GetMapping(value = "/v1/index")
    public Mono<ResultVO> hello(@RequestParam(name = "name") String name) {
        log.info("当前请求进入 /index  ~ ~");
        // 命令式写法
        // return Mono.just(ResultVO.builder().code("200").data(String.format("天青色等烟雨，而我在等你[%s]", name)).msg("success").build());
        // 响应式写法
        return Mono.create(cityMonoSink ->
                cityMonoSink.success(ResultVO.builder()
                        .code("200")
                        .data(String.format("天青色等烟雨，而我在等你[%s]呀", name))
                        .msg("success")
                        .build()));
    }

    @PostMapping("/v1/list")
    public Flux<ResultVO> list() {
        log.info("当前请求进入 /list  ~ ~");

        // 命令式写法 改为响应式 以下语句，需要在流中执行
        // List<ResultVO> list = service.list();
        //响应式写法
        return Flux.fromIterable(Arrays.asList(ResultVO.builder()
                .code("200")
                .data(String.format("天青色等烟雨，而我在等你呀"))
                .msg("success")
                .build(), ResultVO.builder()
                .code("999")
                .data(String.format("天青色等烟雨，而我在等你吗"))
                .msg("success")
                .build()));
    }

}
